package com.jt.www.aop;

import com.jt.www.exception.BizException;
import com.jt.www.model.reps.GenericResponse;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

/**
 * 描述：处理远程调用中code出现
 * 9999的情况等异常情况
 * <p>
 * 类名称：RemoteRpcHandler.java
 * 作者： wangyang
 * 版本：1.0
 * 修改： 2019/2/15 11:15
 * 创建日期： 2019/2/15 11:15
 * 版权：江泰保险经纪股份有限公司
 */
@Aspect
@ComponentScan("com.jt.www.remote")
@Component
public class RemoteRpcHandler {

    public static final Logger log = LoggerFactory.getLogger(RemoteRpcHandler.class);

    @Pointcut("execution(* com.jt.www.remote..*(..))")
    public void remoteRpcCut() {
    }

    /**
     * 切入点return内容之后切入内容（可以用来对处理返回值做一些加工处理）
     *
     * @param obj
     * @throws Throwable
     */
    @AfterReturning(pointcut = "execution(* com.jt.www.remote..*(..)))",
            returning = "obj")
    public void doAfterReturning(JoinPoint jp, Object obj) {
        if (obj instanceof ResponseEntity) {
            try {
                ResponseEntity<GenericResponse> responseEntity = (ResponseEntity) obj;
                // 处理完请求，返回内容
                if (GenericResponse.CODE_NG.equals(responseEntity.getBody().getCode())) {
                    log.error("远程调用失败，错误码：{}，方法：{}，错误信息：{}", responseEntity.getBody().getCode(),
                            jp.getSignature().getName(), responseEntity.getBody().getMsg());
                    throw new BizException("远程调用失败");
                }
            } catch (Exception e) {
            }
        }
    }
}
